 //-------------- CREACION de MATERIALES ----------------//
 function materialBuilder(){
	 
 	/*
	 * DECLARACION DE FUNCIONES (publicas)
	 */
	 this.crearMaterial = crearMaterial;
	 this.crearMaterialTexto = crearMaterialTexto;
 
	 /*
	  * IMPLEMENTACIN DE FUNCIONES (no son accesibles directamente desde "afuera")
	  */
	///////////////////////////////////
	// crearMaterial()
	///////////////////////////////////
	 function crearMaterial(tipo){

		 switch (tipo){
			 case "paredLadrilloSana" : 
				 
				 // ***************************************
				 // ************* NORMAL MAP **************
					var ambient = 0x111111,
						diffuse = 0x555555, 
						specular = 0x996666, 
						shininess = 10, 
						scale = 23;
		
					// normal map shader
					var shader = THREE.ShaderUtils.lib[ "normal" ];
					var uniforms = THREE.UniformsUtils.clone( shader.uniforms );
					
		
					uniforms[ "enableAO" ].value = true;
					uniforms[ "enableDiffuse" ].value = false;
					uniforms[ "enableSpecular" ].value = false;
		
					uniforms[ "tNormal" ].texture = THREE.ImageUtils.loadTexture( "obj/_pared/Map__1_Normal Bump.png" );
					uniforms[ "tAO" ].texture = THREE.ImageUtils.loadTexture( "obj/_pared/fence_01_1024x1024.png" );
					
					uniforms[ "uDiffuseColor" ].value.setHex( diffuse );
					uniforms[ "uSpecularColor" ].value.setHex( specular );
					uniforms[ "uAmbientColor" ].value.setHex( ambient );
		
					uniforms[ "uShininess" ].value = shininess;
		
					var parameters = { fragmentShader: shader.fragmentShader,
										vertexShader: shader.vertexShader, 
										uniforms: uniforms,
										lights: true
										};
		
					repositorioMaterialParedes["paredLadrilloSana"].materialShader = new THREE.MeshShaderMaterial( parameters );
				 break;
		 }
	 }
	 
	 
//---------------------------------
// fin crearMaterialTexto()
//---------------------------------
 function crearMaterialTexto(publicacion, normalMapPath, img){

	 		
		if (debug) alert("entre a crearMaterialTexto");

		var ambient2 = 0x111111,
		diffuse2 = 0x555555, 
		specular2 = 0x996666, 
		shininess2 = 10, 
		scale = 23;
		
		var canv = document.createElement("canvas");			
		//var canv = document.getElementById("example");			
		var ctx = canv.getContext('2d');
		
		ctx.canvas.width = 1024;
		ctx.canvas.height  = 1024;
		//TODO: pasar esto como parametro
		
		//proporciones de la imagen, en la que se imprimira
		var areaImprimible = {
				x : 0,
				y : 0.125,
				width : 0.75,
				height : 0.4375
		}
		
		ctx.canvas.width *= areaImprimible.width;
		ctx.canvas.height *= areaImprimible.height;
		
		var escaladoLetra = 0.07;
		var altoLetra = ctx.canvas.width*escaladoLetra;//40;
		ctx.fillStyle = 'rgba(255, 255, 255, 0)';
		ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height);
		ctx.fillStyle = 'red';
		ctx.lineWidth = 2;
		ctx.strokeStyle = 'black';
		ctx.save();
		ctx.font = "bold "+altoLetra+"px Verdana";
//		ctx.textAlign = 'center';
		ctx.textBaseline = 'middle';

		var text = publicacion.data.message;//"uno dos tres cuatro cinco seis siete ocho nueve diez once doce trece catorce quince";
		
		
		
//		ctx.rotate(- Math.PI / 36);
//		printAt(ctx, text, 0, areaImprimible.y + altoLetra, altoLetra, areaImprimible.width);
		var dimensiones = printAtWordWrap(ctx, text, 0, 0 + altoLetra, altoLetra, ctx.canvas.width, false);
		
		if (debug) {
			alert("heighOcupado: "+heightOcupado);
			alert("areaImprimible.height: "+ctx.canvas.height);
		}
		
//		var entraTexto = printAtWordWrap(ctx, text, 0, areaImprimible.y + altoLetra, altoLetra, areaImprimible.width);
		var cantidadDeParedes = 1;
		if (dimensiones.alto > ctx.canvas.height){
			
			if(debug) alert("entre al if de height > area imprimible");
			
			cantidadDeParedes = Math.ceil(dimensiones.alto / ctx.canvas.height);
			ctx.canvas.width = ctx.canvas.width*cantidadDeParedes;
			ctx.fillStyle = 'rgba(255, 255, 255, 0)';
			ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height);
			ctx.fillStyle = 'red';
			ctx.lineWidth = 2;
			ctx.strokeStyle = 'black';
			
			ctx.font = "bold "+altoLetra+"px Verdana";
//			ctx.textAlign = 'center';
			ctx.textBaseline = 'middle';
//			ctx.save();
//			ctx.fillStyle = 'rgba(255, 255, 255, 0)';
//			ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height);
//			ctx.restore();
			
			dimensiones = printAtWordWrap(ctx, text, 0, 0, altoLetra, ctx.canvas.width, false);
			printAtWordWrap(ctx, text,0, (ctx.canvas.height - dimensiones.alto + altoLetra)/2, altoLetra, ctx.canvas.width,true);
//			printAtWordWrap(ctx, text, 0, 0 + altoLetra, altoLetra, ctx.canvas.width,true);
			
			if(debug) alert("ya dibuje en la pared extendida");
			
			
		}else{
			
			if (img){//TODO

				var ratioImagen = img.naturalWidth/img.naturalHeight;
				var ratioViewport = 1;//areaImprimible.width*ctx.canvas.width / areaImprimible.height*ctx.canvas.height;
				
				/*
			 	context.drawImage(image, dx, dy)
				context.drawImage(image, dx, dy, dw, dh)
				context.drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh)
				 */
				
				//imagen que ocupa todo el viewport (se deforma)
				//ctx.drawImage(img,0,0,img.naturalWidth,img.naturalHeight,
				//				areaImprimible.x,areaImprimible.y,areaImprimible.width, areaImprimible.height);
				
				//imagen que mantiene la relacion de aspecto
				if (ratioViewport > ratioImagen){
					ctx.drawImage(img,0,0,img.naturalWidth,img.naturalHeight,
								  areaImprimible.x*ctx.canvas.width,
								  areaImprimible.y*ctx.canvas.height,
								  ratioImagen*areaImprimible.height*ctx.canvas.height,
								  areaImprimible.height*ctx.canvas.height);
				}else{
					ctx.drawImage(img,0,0,img.naturalWidth,img.naturalHeight,
							      areaImprimible.x*ctx.canvas.width,
							      areaImprimible.y*ctx.canvas.height, 
							      areaImprimible.width*ctx.canvas.width,
							      areaImprimible.width*ctx.canvas.width/ratioImagen);
				}
				
			}
			
			if ( maximizarTexto){
				var oldDimensiones = dimensiones;
				var oldEscaladoLetra =  escaladoLetra;
				// console.log("textoooooooooooooooooooooo",text);
				while ((dimensiones.ancho < ctx.canvas.width && dimensiones.ancho != 0) && (dimensiones.alto < ctx.canvas.height) &&(!dimensiones.palabraCortada)){
					//// console.log("ctx.canvas.width",ctx.canvas.width," ctx.canvas.height", ctx.canvas.height);
					////  console.log("dimensiones.ancho",dimensiones.ancho," dimensiones.alto", dimensiones.alto," dimensiones.palabraCortada", dimensiones.palabraCortada);
					
					
					oldEscaladoLetra = escaladoLetra;
						escaladoLetra = escaladoLetra + 0.01;
					
					 altoLetra = ctx.canvas.width*escaladoLetra;
					oldDimensiones = dimensiones;
					ctx.font = "bold "+altoLetra+"px Verdana";
					dimensiones = printAtWordWrap(ctx, text, 0, 0, altoLetra, ctx.canvas.width, false);
				}
				
				//console.log("ctx.canvas.width",ctx.canvas.width," ctx.canvas.height", ctx.canvas.height);
				//console.log("dimensiones.ancho",dimensiones.ancho," dimensiones.alto", dimensiones.alto);
				dimensiones = oldDimensiones;
				 altoLetra = ctx.canvas.width*oldEscaladoLetra;
				 ctx.font = "bold "+altoLetra+"px Verdana";
				
				if (dimensiones.palabraCortada){
					while (dimensiones.palabraCortada){
						 console.log("ctx.canvas.width",ctx.canvas.width," ctx.canvas.height", ctx.canvas.height);
						  console.log("dimensiones.ancho",dimensiones.ancho," dimensiones.alto", dimensiones.alto," dimensiones.palabraCortada", dimensiones.palabraCortada);
						
						
						oldEscaladoLetra = escaladoLetra;
							escaladoLetra = escaladoLetra - 0.01;
						
						 altoLetra = ctx.canvas.width*escaladoLetra;
						oldDimensiones = dimensiones;
						ctx.font = "bold "+altoLetra+"px Verdana";
						dimensiones = printAtWordWrap(ctx, text, 0, 0, altoLetra, ctx.canvas.width, false);
					}
					//console.log("ctx.canvas.width",ctx.canvas.width," ctx.canvas.height", ctx.canvas.height);
					//console.log("dimensiones.ancho",dimensiones.ancho," dimensiones.alto", dimensiones.alto);
					dimensiones = oldDimensiones;
					 altoLetra = ctx.canvas.width*oldEscaladoLetra;
					 ctx.font = "bold "+altoLetra+"px Verdana";
				}
				
				
			
			}
				
			//rotar texto
			
			
			//ctx.scale(0.8,0.8);
			
			var escala = 1;
			if (rotarTexto){
				var rand = Math.random();
				escala = rand > 0 ? 0.8 : 0.6;
				var angulo  = (10 - rand*20 )*Math.PI / 180;
				ctx.translate((ctx.canvas.width )/2, (ctx.canvas.height)/2);
				ctx.scale(escala,escala);
				ctx.rotate( angulo);
				ctx.translate(-(ctx.canvas.width)/2, -(ctx.canvas.height)/2);
			}
			
			
			ctx.translate((ctx.canvas.width- dimensiones.ancho)/2 ,
					(ctx.canvas.height - dimensiones.alto + altoLetra)/2);
//			ctx.translate((ctx.canvas.width- dimensiones.ancho)/2 + ctx.canvas.width-Math.cos((10 )*Math.PI / 180)*ctx.canvas.width,
//					(ctx.canvas.height - dimensiones.alto)/2 + Math.sin((10 )*Math.PI / 180)*ctx.canvas.width);
			//printAtWordWrap(ctx, text, (ctx.canvas.width - dimensiones.ancho)/2, (ctx.canvas.height - dimensiones.alto + altoLetra)/2 , altoLetra, ctx.canvas.width,true);
			printAtWordWrap(ctx, text, 0, 0 , altoLetra, ctx.canvas.width,true);
			//
//			ctx.rotate( );
		}
		
		
//		printAt(ctx, text, 10, 50, 10, 200);
		ctx.restore();
		
		if (debug) alert("pase la escritura en el canvas extensible");
		if (debug) console.log("este es el canvas extensible", canv );
		
		
		
		
//	var options = {
//			amount : 1, 
//			mode : "multiply", 
//			image : canv
//		};
//		console.log(imagenPared);
//		if (imagenPared.complete) {	// make sure the image is fully loaded
//				canv = Pixastic.process(imagenPared, "blend", 
//					options
//				);
//			console.log(options);
////			console.log(resultado);
//		}
//			
	
		
		//Pixastic.process(canv, "blur");
		
		
		//***** imprimimos el nombre del usuario creador de la nota
		var areaImprimibleNombreUsuario = {
				x : 0.875,
				y : 0.125,
				width : 0.125,
				height : 0.375,
				orientation: "vertical",
//				direction: "asc"
		}
		
		var canvNombreUsuario = document.createElement("canvas");			
		var ctxNombreUsuario = canvNombreUsuario.getContext('2d');
		
		ctxNombreUsuario.canvas.height = areaImprimibleNombreUsuario.width*1024;
		ctxNombreUsuario.canvas.width  = areaImprimibleNombreUsuario.height*1024*cantidadDeParedes*2;
		
		escaladoLetra = 0.07;
		var altoLetraNombre = ctxNombreUsuario.canvas.width/cantidadDeParedes*escaladoLetra;
		
		ctxNombreUsuario.save();
		ctxNombreUsuario.font = "bold "+altoLetraNombre+"px Verdana";
		ctx.textAlign = 'center';
		ctxNombreUsuario.textBaseline = 'middle';		
		 dimensiones = printAtWordWrap(ctxNombreUsuario, publicacion.data.from.name, 0, ctxNombreUsuario.canvas.height/2 , altoLetraNombre, ctxNombreUsuario.canvas.width, false);

		//+50 del ancho de la imagen del usuario
		while ((dimensiones.ancho+80) > ctxNombreUsuario.canvas.width || dimensiones.alto > ctxNombreUsuario.canvas.height){
			escaladoLetra = escaladoLetra - 0.01;
			altoLetraNombre = ctxNombreUsuario.canvas.width/cantidadDeParedes*escaladoLetra;		
			ctxNombreUsuario.font = "bold "+altoLetraNombre+"px Verdana";
			dimensiones = printAtWordWrap(ctxNombreUsuario, publicacion.data.from.name, 0, ctxNombreUsuario.canvas.height/2 , altoLetraNombre, ctxNombreUsuario.canvas.width, false);
		};
		
		publicacion.proporcionAnchoNombre = dimensiones.ancho/ctxNombreUsuario.canvas.width;
		
		ctxNombreUsuario.fillStyle = 'rgba(255, 255, 255, 0)';
		ctxNombreUsuario.fillRect(0, 0, ctxNombreUsuario.canvas.width, ctxNombreUsuario.canvas.height);
		ctxNombreUsuario.fillStyle = 'gray';
		ctxNombreUsuario.lineWidth = 2;
		ctxNombreUsuario.strokeStyle = 'black';
		
		printAtWordWrap(ctxNombreUsuario, publicacion.data.from.name,(ctxNombreUsuario.canvas.width - dimensiones.ancho)/2, ctxNombreUsuario.canvas.height/2 , altoLetraNombre, ctxNombreUsuario.canvas.width,true);

		//ctxNombreUsuario.drawImage(publicacion.imagen,0,0);
		//esto no se puede hacer sin agregar una excepcion en el browser
		//porque al "pegarla" en la pared, y al postprocesar la imagen
		//se usa el metodo "getImageData" el cual puede ocasionar problemas de seguridad
				
		
		ctxNombreUsuario.restore();
		//***** fin imprimimos el nombre del usuario creador de la nota
		
		
		var materialesTexto = new Array(); //arreglo de materiales de texto a retornar
		
		if (debug) alert("antes de entrar al for que genera los materiales de texto");
		for (var i = 0;  i < cantidadDeParedes; i++){
			
			var canvasPorPared = document.createElement("canvas");			
			//var canvasPorPared = document.getElementById("example");			
			var contexto = canvasPorPared.getContext('2d');
			
			contexto.canvas.width = 1024;
			contexto.canvas.height = 1024;
			
			if (debug) alert("estoy en el for: antes de draw image");
			//dibujamos el texto para esta pared
			contexto.drawImage(canv,
								ctx.canvas.width/cantidadDeParedes*i,
								0,
								ctx.canvas.width/cantidadDeParedes,
								ctx.canvas.height,
					
								areaImprimible.x*contexto.canvas.width,
								areaImprimible.y *contexto.canvas.height,
								areaImprimible.width*contexto.canvas.width,
								areaImprimible.height*contexto.canvas.height);
			
			
			//dibujamos el nombre del usuario creador de la publicacion
//			var areaImprimibleNombreUsuario = {
//					x : 0.875,
//					y : 0.125,
//					width : 0.125,
//					height : 0.375,
//					orientation: "vertical",
//				//	direction: "asc"
//			}
//			
//			
			if (debug) alert("estoy en el for: despues de draw image");
			contexto.save();
			
			if (debug) alert("estoy en el for: traslado");
			//contexto.translate(areaImprimibleNombreUsuario.x*contexto.canvas.width, areaImprimibleNombreUsuario.y*contexto.canvas.height );
			contexto.translate((areaImprimibleNombreUsuario.x+ areaImprimibleNombreUsuario.width)*contexto.canvas.width,
							   areaImprimibleNombreUsuario.y*contexto.canvas.height );
			
		
			
			xNombre = 0;
			yNombre = 0;
			anchoNombre = areaImprimibleNombreUsuario.width*contexto.canvas.width;
			altoNombre = areaImprimibleNombreUsuario.height*contexto.canvas.height;
			
//			if (areaImprimibleNombreUsuario.orientation == "vertical"){
//				contexto.rotate( Math.PI / 2);
//				altoNombre = areaImprimibleNombreUsuario.x*contexto.canvas.width;
//				anchoNombre  = areaImprimibleNombreUsuario.y*contexto.canvas.height;
//			}
//			
			if (debug) alert("estoy en el for: rotacion");
			contexto.rotate( Math.PI / 2);
			
//			contexto.fillStyle = 'rgb(0,255, 0)';
//			contexto.fillRect(0, 0,altoNombre, anchoNombre  );
			
			contexto.drawImage(canvNombreUsuario,
					ctxNombreUsuario.canvas.width/cantidadDeParedes*i,
					0,
					ctxNombreUsuario.canvas.width/cantidadDeParedes,
					ctxNombreUsuario.canvas.height,
		
					xNombre,
					yNombre,
					altoNombre,anchoNombre
					);
			contexto.scale(0.5,1);
			
//			contexto.fillStyle = 'rgb(255,0, 0)';
//			contexto.fillRect(0, 0, 50, 50);
//		
			
			contexto.restore();
			
			if (debug) alert("estoy en el for: empiezo con el shader");
			
			
			var options = {
					amount : 0.75, 
					mode : "multiply", 
					image : imagenPared
				};
				if (imagenPared.complete) {	// make sure the image is fully loaded
					canvasPorPared = Pixastic.process(canvasPorPared, "blend", options);
				}
			
			if (debug) alert("estoy en el for: pase draw image");
			
			var shader = THREE.ShaderUtils.lib[ "normal" ];
			var uniforms2 = THREE.UniformsUtils.clone( shader.uniforms );
			
			uniforms2[ "enableAO" ].value = true;
			uniforms2[ "enableDiffuse" ].value = false;
			uniforms2[ "enableSpecular" ].value = false;
			
			uniforms2[ "tNormal" ].texture = THREE.ImageUtils.loadTexture( normalMapPath );
			uniforms2[ "tAO" ].texture = new THREE.Texture( canvasPorPared );//THREE.ImageUtils.loadTexture( "obj/_pared/fence_01_1024x1024.png" );
			
			uniforms2[ "uDiffuseColor" ].value.setHex( diffuse2 );
			uniforms2[ "uSpecularColor" ].value.setHex( specular2 );
			uniforms2[ "uAmbientColor" ].value.setHex( ambient2 );
			
			uniforms2[ "uShininess" ].value = shininess2;
			
			var parameters2 = { fragmentShader: shader.fragmentShader,
					vertexShader: shader.vertexShader, 
					uniforms: uniforms2,
					lights: true,
//					blending: THREE.MultiplyBlending, 
//					transparent: true 
			};
			
			var material2 = new THREE.MeshShaderMaterial( parameters2 );
			material2.uniforms.tAO.texture.needsUpdate = true;
			materialesTexto.push(material2);
		}
		
		if (debug) alert("despues de entrar al for que genera los materiales de texto");
		
		
		return materialesTexto;
 }
//---------------------------------
// fin crearMaterialTexto()
//---------------------------------
 
 /*
  THREE.NormalBlending = 0;
THREE.AdditiveBlending = 1;
THREE.SubtractiveBlending = 2;
THREE.MultiplyBlending = 3;
THREE.AdditiveAlphaBlending = 4;
  * */
 //-------------- fin CREACION de MATERIALES ----------------//
 }